package com.gitee.deament.server.core.cli.db.sortset;

import com.gitee.deament.server.config.SystemConfig;
import com.gitee.deament.server.core.annotation.CliHander;
import com.gitee.deament.server.core.cli.AbstractCli;
import com.gitee.deament.server.core.data.ConnectData;
import com.gitee.deament.server.core.data.ZSortSet;
import com.gitee.deament.server.core.data.ZSortSetMember;
import com.gitee.deament.server.core.data.datatype.Value;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;

import java.math.BigDecimal;
import java.util.List;

/**
 * ZINCRBY key increment member
 * 可用版本： >= 1.2.0
 * 时间复杂度: O(log(N))
 * 为有序集 key 的成员 member 的 score 值加上增量 increment 。
 *
 * 可以通过传递一个负数值 increment ，让 score 减去相应的值，比如 ZINCRBY key -5 member ，就是让 member 的 score 值减去 5 。
 *
 * 当 key 不存在，或 member 不是 key 的成员时， ZINCRBY key increment member 等同于 ZADD key increment member 。
 *
 * 当 key 不是有序集类型时，返回一个错误。
 *
 * score 值可以是整数值或双精度浮点数。
 *
 * 返回值
 * member 成员的新 score 值，以字符串形式表示。
 * @author deament
 */
@CliHander(command = "ZINCRBY")
public class ZINCRBYcli extends AbstractCli {


    @Override
    public void executeCli(ChannelHandlerContext channelHandlerContext, String command) {
        List<String> cliValues = getValues(command);
        if (cliValues.size() !=4) {
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("ERR wrong number of arguments for 'ZINCRBY' command"));
            return;
        }
        String key = cliValues.get(1);
        String increment = cliValues.get(2);
        String member = cliValues.get(3);
        int db = ConnectData.SELECT_DB_STORAGE.getUseDB(channelHandlerContext.channel().id().asLongText());
        try {
            BigDecimal score=new BigDecimal(increment);
            Value<ZSortSet> zSortSetData = SystemConfig.dbData.getZSortSetData(db, key);
            if(zSortSetData==null ||zSortSetData.getValue()==null ||zSortSetData.getValue().getData()==null|| zSortSetData.getValue().getMember(member)==null){
                SystemConfig.dbData.setZSortSetData(db, key,new ZSortSetMember(score,member));
                return;
            }
            ZSortSetMember zSortSetMember =    zSortSetData.getValue().getMember(member);
            zSortSetMember.setScore(zSortSetMember.getScore().add(score));
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame(zSortSetData.getValue().getMember(member).getScore()+""));
            return;

        }catch (Exception e){
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame(e.getMessage()));
            return;
        }
    }
}
